from flask import Blueprint, jsonify, request, session, redirect, url_for  # 导入Flask相关模块
from flask_jwt_extended import jwt_required
from werkzeug.security import generate_password_hash

from applications.models import User, db  # 导入User模型和数据库实例
# from applications.view.system.decorators import jwt_required  # 导入jwt_required装饰器

# 创建用户端用户管理蓝图
user_bp = Blueprint('user_bp', __name__, url_prefix='/system/user')


# 获取用户端用户列表
@user_bp.route('/list', methods=['GET'])
@jwt_required()
def get_users():
    try:
        username = request.args.get('username', None)  # 获取查询参数
        if username is not None and username.strip():  # 检查是否为 None 且不是空字符串:
            users = User.query.filter(User.username.like(f"%{username}%")).all()
        else:
            users = User.query.all()

        return jsonify({'code': 200, 'msg': '用户列表获取成功！', 'data': {
            'list': [user.to_dict() for user in users],
            'total': len(users)
        }}), 200
    except Exception as e:
        print('获取用户失败', e)
        return jsonify({'code': 500, 'msg': '获取用户失败', 'error': str(e)})

# 添加新用户
@user_bp.route('/add', methods=['POST'])
@jwt_required()  # 应用装饰器
def add_user():
    try:
        data = request.json  # 获取请求中的JSON数据
        # 账号手机号已存在
        if User.query.filter_by(username=data['username']).first() or User.query.filter_by(phone=data.get('phone')).first():
            return jsonify({'code': 400, 'msg': '账号或手机号已存在！'})
        new_user = User(  # 创建新用户实例
            username=data['username'],
            password=data['password'],
            phone=data.get('phone'),
            sex=data.get('sex', '男'),
            description=data.get('description'),
            enable=data.get('enable', 0)
        )
        db.session.add(new_user)  # 将新用户添加到数据库会话
        db.session.commit()  # 提交会话
        return jsonify({'code': 201, 'msg': '用户添加成功！'}), 201  # 返回成功信息
    except Exception as e:
        print('添加用户失败', e)
        return jsonify({'code': 500, 'msg': '添加用户失败', 'error': str(e)})

# 编辑用户信息
@user_bp.route('/<int:user_id>', methods=['PUT'])
@jwt_required()  # 应用装饰器
def edit_user(user_id):
    user = User.query.get_or_404(user_id)  # 根据用户ID查询用户
    data = request.json  # 获取请求中的JSON数据

    # 更新用户信息
    user.username = data.get('username', user.username)
    user.nickname = data.get('nickname', user.nickname)
    user.description = data.get('description', user.description)
    password = data.get('password', user.password)
    # 如果用户设置了新密码
    if password:
        user.password = generate_password_hash(password)
    sex_raw = data.get('gender')
    print('性别字段处理完毕0', data)
    if sex_raw == '' or sex_raw is None:
        user.sex = None  # 业务默认 0-未知
    else:
        user.gender = int(sex_raw)
    user.phone = data.get('phone', user.phone)
    user.enable = data.get('enable', user.enable)  # 更新启用状态

    try:
        db.session.commit()  # 提交会话
        return jsonify({'code': 200, 'msg': '用户信息更新成功！'})  # 返回成功信息
    except Exception as e:
        db.session.rollback()  # 回滚会话
        print('更新用户时出错:', str(e))  # 打印错误信息
        return jsonify({'code': 500, 'msg': '更新用户失败', 'error': str(e)}), 500

# 删除用户
@user_bp.route('/<int:user_id>', methods=['DELETE'])
@jwt_required()  # 应用装饰器
def delete_user(user_id):
    user = User.query.get_or_404(user_id)  # 根据用户ID查询用户
    try:
        db.session.delete(user)  # 从会话中删除用户
        db.session.commit()  # 提交会话
        return jsonify({'code': 200, 'msg': '用户删除成功！'}), 200  # 返回成功信息
    except Exception as e:
        db.session.rollback()  # 回滚会话
        print('删除用户时出错:', str(e))
        return jsonify({'code': 500, 'msg': '删除用户失败', 'error': str(e)})  # 返回错误信息

# 启用/禁用用户
@user_bp.route('/<int:user_id>/status', methods=['PUT'])
@jwt_required()  # 应用装饰器
def toggle_user(user_id):
    user = User.query.get_or_404(user_id)  # 根据用户ID查询用户
    data = request.json  # 获取请求中的JSON数据
    enable_status = data.get('enable')  # 获取前端传递的启用状态

    # 检查启用状态是否有效
    if enable_status not in [0, 1]:
        return jsonify({'code': 400, 'msg': '无效的启用状态！'}), 400  # 返回错误信息

    user.enable = enable_status  # 设置用户的启用状态

    try:
        db.session.commit()  # 提交会话
        return jsonify({'code': 200, 'msg': '用户状态更新成功！', 'enable': user.enable}), 200  # 返回成功信息
    except Exception as e:
        db.session.rollback()  # 回滚会话
        return jsonify({'code': 500, 'msg': '用户状态更新失败！', 'error': str(e)}), 500  # 返回错误信息


# 注册用户端用户管理蓝图
def register_user_bps(app):
    app.register_blueprint(user_bp)
